<?php

namespace Sbm;

class ObjectSearch
{

	/**
	 * Объект с базой данных
	 * 
	 * @var DB
	 */
	var $db;

	function __construct( &$db )
	{
		$this->db = $db;
		$this->filters = array(
			'select' => '',
			'from' => '',
			'where' => '',
			'orderby' => '',
			'limit' => '',
			'groupby' => '',
		);
	}

	/**
	 * Возвращает массив заказов
	 * 
	 * @param DB $db
	 * @param array $filters - array('select'=>string,'from'=>string,'where'=>string,'orderby'=>string,'limit'=>string);
	 * @return array of false
	 */
	function GetByFilters( $filters = NULL )
	{
		$filters = $this->Extend($filters, $this->GetDefaultFilters());

		$select = empty($filters['select']) ? '' : 'SELECT ' . $filters['select'];
		$from = empty($filters['from']) ? '' : 'FROM ' . $filters['from'];
		$where = empty($filters['where']) ? '' : 'WHERE ' . $filters['where'];
		$orderby = empty($filters['orderby']) ? '' : 'ORDER BY ' . $filters['orderby'];
		$limit = empty($filters['limit']) ? '' : 'LIMIT ' . $filters['limit'];
		$groupby = empty($filters['groupby']) ? '' : '';

		// формируем SQL запрос
		$mysql_query = sprintf("%s %s %s %s %s", $select, $from, $where, $orderby, $limit);
		// print $mysql_query;
		// Выполняем SQL запрос и возвращаем список объектов
		return $this->GetByQuery($mysql_query, array($this, 'CreateOneItem'));
	}

	/**
	 * Вызывается при создании элемента списка
	 * 
	 * @param array $init_array
	 * @return Object
	 */
	protected function CreateOneItem( $init_array )
	{
		return NULL;
	}

	protected function GetDefaultFilters()
	{
		return NULL;
	}

	/**
	 * Возвращает массив объектов по SQL-запросу $query
	 * 
	 * @param string $query
	 * @param function $callback
	 * @return array or false
	 */
	protected function GetByQuery( $query, $callback )
	{
		$list = array();
		$q = $this->db->Query($query);
		while ($r = $q->FetchRow())
		{
			$item = call_user_func($callback, $r);
			$list[] = $item;
		}
		if ( sizeof($list) )
		{
			return $list;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Возвращает массив полученный из $orig_array с добавлением/перезаписываением элементами из $new_array 
	 * @param array $orig_array
	 * @param array $new_array
	 * @return array
	 */
	function Extend( $orig_array, $new_array )
	{
		if ( !is_array($orig_array) )
		{
			trigger_error("\$orig_array must be array", E_USER_WARNING);
		}
		if ( !is_array($new_array) )
		{
			return $orig_array;
		}
		$result = $orig_array;
		foreach ($new_array as $property => $value)
		{
			if ( !isset($result[$property]) )
			{
				$result[$property] = $value;
			}
		}
		return $result;
	}

}